Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_incoming_call_policy.py

Displaying Raw • Download


tests/backend/test_incoming_call_policy.py v4.7.2-rc.5 (868d1d64) Text, 9.61 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Incoming-call policy: blocked list, DND, contacts-only / block-strangers, voicemail + ring."""

Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat

Te6edf3CALLER_HASH_HEX Tff7b72= Ta5d6ff"Ta5d6ffa1Ta5d6ff" Tff7b72* T79c0ff16


Tff7b72def Td2a8ff_caller_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3ident Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3identTff7b72.Td2a8ffhash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3CALLER_HASH_HEXTb4b4b4)
Tff7b72return Te6edf3ident


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffpolicy_appTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff__new__Tb4b4b4(Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tm Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffinitiation_status Tff7b72= Tff7b72None
Te6edf3tmTff7b72.Td2a8fftelephone Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8fftelephone_manager Tff7b72= Te6edf3tm
Te6edf3ctxTff7b72.Td2a8ffconfig Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3ctxTff7b72.Td2a8ffvoicemail_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffcurrent_context Tff7b72= Te6edf3ctx
Te6edf3appTff7b72.Td2a8ffis_destination_blocked Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3appTff7b72.Td2a8ffwebsocket_broadcast Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3app


Tff7b72def Td2a8ff_run_incomingTb4b4b4(Te6edf3appTb4b4b4, Te6edf3callerTb4b4b4, Te6edf3ctxTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3bound Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ffon_incoming_telephone_callTff7b72.Td2a8ff__get__Tb4b4b4(Te6edf3appTb4b4b4, Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3boundTb4b4b4(Te6edf3callerTb4b4b4, Te6edf3contextTff7b72=Te6edf3ctxTb4b4b4)


Tff7b72def Td2a8fftest_incoming_rejects_when_blocked_uses_delayed_hangupTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.threading.TimerTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_timerTb4b4b4:

Tff7b72def Td2a8ffrun_timerTb4b4b4(Te6edf3delayTb4b4b4, Te6edf3fnTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3delay Tff7b72== T79c0ff0.5
Te6edf3fnTb4b4b4(Tb4b4b4)
Te6edf3t Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tTff7b72.Td2a8ffstart Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t

Te6edf3mock_timerTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3run_timer

Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

Te6edf3policy_appTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_incoming_dnd_rejects_before_contact_checkTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Tb4b4b4}

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.threading.TimerTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_timerTb4b4b4:

Tff7b72def Td2a8ffrun_timerTb4b4b4(Te6edf3delayTb4b4b4, Te6edf3fnTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3delay Tff7b72== T79c0ff0.5
Te6edf3fnTb4b4b4(Tb4b4b4)
Te6edf3t Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tTff7b72.Td2a8ffstart Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t

Te6edf3mock_timerTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3run_timer

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_contacts_only_rejects_non_contact_uses_identity_lookupTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.threading.TimerTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_timerTb4b4b4:

Tff7b72def Td2a8ffrun_timerTb4b4b4(Te6edf3delayTb4b4b4, Te6edf3fnTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3delay Tff7b72== T79c0ff0.5
Te6edf3fnTb4b4b4(Tb4b4b4)
Te6edf3t Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tTff7b72.Td2a8ffstart Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t

Te6edf3mock_timerTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3run_timer

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3CALLER_HASH_HEXTb4b4b4,
Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_contacts_only_accepts_matching_contactTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFriendTa5d6ff"Tb4b4b4,
Tb4b4b4}

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

T8b949e# Called twice: once for policy check, once for websocket broadcast is_contact flag
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_called_withTb4b4b4(
Te6edf3CALLER_HASH_HEXTb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffcall_count
Tff7b72== T79c0ff2
Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3caller
Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_block_all_strangers_uses_same_contact_gateTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.threading.TimerTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_timerTb4b4b4:

Tff7b72def Td2a8ffrun_timerTb4b4b4(Te6edf3delayTb4b4b4, Te6edf3fnTb4b4b4)Tb4b4b4:
Te6edf3fnTb4b4b4(Tb4b4b4)
Te6edf3t Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tTff7b72.Td2a8ffstart Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3t

Te6edf3mock_timerTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3run_timer

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3CALLER_HASH_HEXTb4b4b4,
Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_when_policy_off_stranger_ringsTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

T8b949e# Called once for websocket broadcast is_contact flag even when policy is off
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3CALLER_HASH_HEXTb4b4b4,
Tb4b4b4)
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_called_once_withTb4b4b4(
Te6edf3caller
Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_ignores_incoming_while_outgoing_initiationTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffinitiation_status Tff7b72= Ta5d6ff"Ta5d6ffDialing...Ta5d6ff"
Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4)

Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3async_utilsTff7b72.Td2a8ffrun_asyncTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_uses_passed_context_not_app_current_contextTb4b4b4(Te6edf3policy_appTb4b4b4)Tb4b4b4:
T8b949e"""Ensure on_incoming_telephone_call uses the ctx parameter, not self.current_context."""
Te6edf3policy_appTff7b72.Td2a8ffis_destination_blockedTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdo_not_disturb_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fftelephone_allow_calls_from_contacts_onlyTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3policy_appTff7b72.Td2a8ffconfigTff7b72.Td2a8ffblock_all_from_strangersTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False

T8b949e# current_context has no contact
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None

T8b949e# But a different ctx passed to the method DOES have the contact
Te6edf3other_ctx Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3other_ctxTff7b72.Td2a8fftelephone_manager Tff7b72= Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8fftelephone_manager
Te6edf3other_ctxTff7b72.Td2a8ffconfig Tff7b72= Te6edf3policy_appTff7b72.Td2a8ffconfig
Te6edf3other_ctxTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3other_ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffFriendTa5d6ff"Tb4b4b4,
Tb4b4b4}
Te6edf3other_ctxTff7b72.Td2a8ffvoicemail_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)

Te6edf3caller Tff7b72= Te6edf3_caller_identityTb4b4b4(Tb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3async_utilsTb4b4b4:
Te6edf3async_utilsTff7b72.Td2a8ffrun_async Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3_run_incomingTb4b4b4(Te6edf3policy_appTb4b4b4, Te6edf3callerTb4b4b4, Te6edf3ctxTff7b72=Te6edf3other_ctxTb4b4b4)

T8b949e# Called twice: once for policy check, once for websocket broadcast is_contact flag
Te6edf3other_ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_called_withTb4b4b4(
Te6edf3CALLER_HASH_HEXTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3other_ctxTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffcall_count Tff7b72== T79c0ff2
Te6edf3policy_appTff7b72.Td2a8ffcurrent_contextTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcontactsTff7b72.Td2a8ffget_contact_by_identity_hashTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Te6edf3other_ctxTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffhandle_incoming_callTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Te6edf3callerTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────